//=====================================================================
//
//  lexer
//  -------
//    Well, the lexer is what actually, y'know, _lexes_. 
//
//=====================================================================
#ifndef KALEIDOSCOPE_PARSER_HPP
#define KALEIDOSCOPE_PARSER_HPP
//=====================================================================
#include <sooty/frontend/syntactic_analysis/abstract_parser.hpp>
//=====================================================================
#include <kaleidoscope/kaleidoscope.hpp>
#include <kaleidoscope/common/channels.hpp>
//=====================================================================
KALEIDOSCOPE_BEGIN
//=====================================================================

	class main_parser
		: public atma::sooty::abstract_parser
	{
	public:
		main_parser(const atma::sooty::lexeme_list& lexemes);
		
		void print_tree() const;
		
	protected:
		typedef atma::sooty::parseme_ptr parseme_ptr;
		void start_rule_impl();
		void print_tree_impl(const atma::sooty::parseme_ptr&, int) const;
		
		// a function
		parseme_ptr match_function();
		// identifier | built-in-type
		parseme_ptr match_type();
		// list of parameters
		parseme_ptr match_parameter_list();
		parseme_ptr match_parameter();
		parseme_ptr match_identifier();
		parseme_ptr match_function_body();
		parseme_ptr match_rvalue();
		
		parseme_ptr match_integral_literal();
		
		parseme_ptr match_expression();
		parseme_ptr match_factor();
		parseme_ptr match_statement();
		parseme_ptr match_return_statement();
		parseme_ptr match_function_call();
		
		parseme_ptr match_variable_definition();
		
	protected:
		bool is_rvalue(size_t id) const;
	};

//=====================================================================
KALEIDOSCOPE_CLOSE
//=====================================================================
#endif
//=====================================================================
